/**
 * @property isArray 判断数据是否为数组
 * @property isObject 判断数据类型是否为Object
 * @property isString 判断数据类型是否为String
 * @property isFunction 判断数据是否为Function
 * @property isHtmlElement 判断节点是否为html节点
 * @property isUndefined 判断数据类型是否为undefined
 * @property isDefined 判断数据类型是否定义
 */

/**
 * 判断数据类型
 * @param {String} type 判断数据属于什么类型
 * @example
 * 如是否是object [type='Object']
 * @param {*} data 需要判断的数据
 */
const getDataType = (type, data) => {
  return Object.prototype.toString.call(data) === `[object ${type}]`
}

/**
 * 判断数据是否为数组
 */
export const isArray = data => {
  return getDataType('Array', data)
}

/**
 * 判断数据类型是否为Object
 */
export function isObject(data) {
  return getDataType('Object', data)
}

/**
 * 判断数据类型是否为String
 */
export function isString(obj) {
  return typeof obj === 'string'
}

/**
 * 判断节点是否为html节点
 */
export function isHtmlElement(node) {
  return node && node.nodeType === Node.ELEMENT_NODE
}

/**
 * 判断数据是否为function
 */
export const isFunction = functionToCheck => {
  return getDataType('Function', functionToCheck) || isAsyncFunction(functionToCheck)
}

/**
 * 判断数据类型是否为undefined
 */
export const isUndefined = val => {
  return val === void 0
}

/**
 * 判断数据类型是否定义
 */
export const isDefined = val => {
  return val !== undefined && val !== null
}

/**
 * 判断数据是否为async functiom
 */
export const isAsyncFunction = functionToCheck => {
  return getDataType('AsyncFunction', functionToCheck)
}

/**
 * 判断数据是否为Date
 */
export const isDate = data => {
  return getDataType('Date', data)
}
